import Dexie, {type EntityTable} from 'dexie';

/**
 * 缓存最大保存时间：一天
 */
const CACHE_EXPIRATION_TIME = 1000 * 60 * 60 * 23;

/**
 * 文件上传信息接口
 */
interface FileUploadInfo {
  timestamp: number;  // 上传的时间戳
  uploadId: string;   // 分片上传的唯一标识
  md5: string;        // 文件的MD5值
}

/**
 * 定义文件上传缓存数据库
 */
const uploadCacheDB = new Dexie('file-upload-cache') as Dexie & {
  uploads: EntityTable<FileUploadInfo, 'md5'>;
};

// 配置数据库版本及表结构
uploadCacheDB.version(1).stores({
  uploads: '++md5, uploadId, timestamp'  // 主键为 "md5"
});

/**
 * 清理过期的缓存数据（超过指定有效期的记录）
 */
uploadCacheDB.uploads
  .where('timestamp')
  .below(Date.now() - CACHE_EXPIRATION_TIME)
  .delete()
  .catch((error) => console.error('清理过期缓存失败:', error));

/**
 * 根据MD5获取对应的上传信息，并检查是否过期
 * @param md5 文件的MD5值
 * @returns 返回有效的上传信息，或 undefined
 */
async function get(md5: string): Promise<FileUploadInfo | undefined> {
  const uploadInfo = await uploadCacheDB.uploads.get(md5);

  // 判断数据是否过期
  if (uploadInfo && Date.now() - uploadInfo.timestamp > CACHE_EXPIRATION_TIME) {
    // 数据过期则删除并返回 undefined
    remove(md5);
    return undefined;
  }

  return uploadInfo;
}

/**
 * 存储文件上传信息
 * @param info 文件上传信息
 */
function put(info: FileUploadInfo) {
  return uploadCacheDB.uploads.put(info);
}

/**
 * 根据MD5值删除对应的文件上传信息
 * @param md5 文件的MD5值
 */
async function remove(md5: string) {
  return uploadCacheDB.uploads.delete(md5);
}

export type {FileUploadInfo};
export default {get, put, remove};
